package com.neusoft.thread8lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
 * Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作，它能以更优雅的方式处理线程同步问题
 * @author Zhang.Yan
 *
 */
public class ReentrantLockTest 
{

	public static void main(String[] args) 
	{
		final OutPuter outer=new OutPuter();
		
		new Thread(){
			public void run() 
			{
//				outer.printfSync("lisi");
				outer.printfLock("lisi");
			};
		}.start();
		
		new Thread(){
			public void run() 
			{
//				outer.printfSync("zhangsan");
				outer.printfLock("zhangsan");
			};
		}.start();

	}

}

class OutPuter 
{
	public synchronized void printfSync(String str)
	{
		int len=str.length();
		for(int i=0;i<len;i++)
		{
			try 
			{
				System.out.print(str.charAt(i));
				Thread.sleep((int)Math.random()*10);
			} 
			catch (InterruptedException e) 
			{
				e.printStackTrace();
			}
		}
	}
	
	Lock lock=new ReentrantLock();
	
	public void printfLock(String str)
	{
		try
		{
			lock.lock();
			int len=str.length();
			for(int i=0;i<len;i++)
			{
				try 
				{
					System.out.print(str.charAt(i));
					Thread.sleep((int)Math.random()*10);
				} 
				catch (InterruptedException e) 
				{
					e.printStackTrace();
				}
			}
		}
		finally
		{
//			需要注意的是，用sychronized修饰的方法或者语句块在代码执行完之后锁自动释放，
//			而用Lock需要我们手动释放锁，为了保证锁最终被释放(发生异常情况)，释放锁放在finally内。
			lock.unlock();
		}
	}
}
